


var Company = Ext.data.Record.create([  // 定义公司类的数据格式， 在js文件中 可用 new Company 创建实例 
	
	{ name : 'company.companyId',//name字段 指的是在js文件中 相应数据的名称。（使用此映射方法在与方便与struts打交道，让struts可以批量的
								//存取整个实体，比如 在struts的Action中只需 private Company company； struts就能把Company的各个字段全都set进去）
								//注意此字段“.”前面的 company 要与 struts中的 字段名称一致。如果你还是不能理解，需要补补struts知识了。
	
	  mapping : 'companyId',  //mapping字段指的是 从后台送过来的json数据中，此字段的名字
	  type : 'int'}, 	
	{ name : 'company.companyName',  mapping : 'companyName', type : 'string'},
//	{ name : 'company.etype',  		 mapping : 'etype', 	  type : 'object'},
	{ name : 'etypeId',     mapping : 'etype.id',    type : 'int'},
	//由于此字段是外键字段，不能由struts自动set进去（类型不一致的原因），所以只能手动set，命名规则不能再用company.etype这样的了
	//凡是涉及到要从数据库中加载信息的下拉列表都不能自动set，请仔细体会
	{ name : 'etypeName',   mapping : 'etype.name',  type : 'string'},
	{ name : 'company.address',		 mapping : 'address',	  type : 'string'},
	{ name : 'company.tellPhone',	 mapping : 'tellPhone',   type : 'string'}, 
	{ name : 'company.leader',		 mapping : 'leader',	  type : 'string'}, 
	{ name : 'company.mobilePhone',	 mapping : 'mobilePhone', type : 'string'}, 
	{ name : 'company.remark',		 mapping : 'remark',	  type : 'string'}
]);


var ds_enterpriseType_select = new Ext.data.Store({
	autoLoad : true,//自动加载（在js加载到页面时候即执行此操作），请斟酌使用
	url : 'findAllEnterpriseType.action',
	reader : new Ext.data.JsonReader({
		root : 'root'
	},
	[{name : 'etypeId',  mapping: 'id', type : 'int'},
	//此处的名字name字段要和上面名称的一致，这样是为了能自动获取选中行的数据
	 {name : 'etypeName',mapping:'name', type : 'string'},
	 {name : 'etypeNum', mapping: 'num',  type : 'int'}
	])
});

var tpl3=new Ext.Template(
	   '<p><table width="100%"  border="1" cellspacing="6" cellpadding="4">'
	
			+ '<tr> <td width="19%" align="right" nowrap="nowrap">企业名称</td><td width="38%" nowrap="nowrap"> {enterprise.name}</td>' 
//			     + '<td width="15%" align="right" nowrap="nowrap">&nbsp;</td>'
//			     + '<td width="28%" nowrap="nowrap">&nbsp;</td>' 
			 +'</tr>' 
			                                
			+ '<tr> <td align="right" nowrap="nowrap">企业种类</td><td nowrap="nowrap">{etypeName}</td>' 
//			     + '<td align="right" nowrap="nowrap">&nbsp;</td><td nowrap="nowrap">&nbsp;</td>' 
			 + '</tr>' 
			                               
			 + '<tr> <td align="right" nowrap="nowrap">所属行业</td><td nowrap="nowrap">{eIndName}</td>' 
//			      + '<td align="right" nowrap="nowrap">页&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数：</td><td nowrap="nowrap">{pageCount}</td>' 
			 + '</tr>'
			                                    
			 +'<tr> <td align="right" nowrap="nowrap">注册地址</td><td nowrap="nowrap">{enterprise.registerAddress}</td>' 
//			     + '<td align="right" nowrap="nowrap">开&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本：</td><td nowrap="nowrap">{bookSize}</td>' 
			  +'</tr>' 
			                               
			  +'<tr> <td align="right" nowrap="nowrap">注册时间</td><td nowrap="nowrap">{enterprise.registerTime}</td>' 
//			      + '<td align="right" nowrap="nowrap">纸&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;张：</td><td nowrap="nowrap">{paper}</td>' 
			  +'</tr>'
			                               
			  +'<tr> <td align="right" nowrap="nowrap">联&nbsp;&nbsp;系&nbsp;&nbsp;人</td><td nowrap="nowrap">{enterprise.contactName}</td>' 
//			      + '<td align="right" nowrap="nowrap">包&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;装：</td> <td nowrap="nowrap">{pack}</td>' 
			 + '</tr>' 
			                              
			 +'<tr> <td align="right" nowrap="nowrap">联系电话</td><td nowrap="nowrap">{enterprise.contactMobile}</td>' 
//			     + '<td align="right" nowrap="nowrap">字　&nbsp;&nbsp;&nbsp;数：</td><td nowrap="nowrap">{wordCount}</td>' 
			 +'</tr>' 
	+ '</table></p>' 
	);
//公司信息列表，Grid的列模型（ColumnModel）的默认实现。该类由列配置组成的数组初始化。 就是配置列要怎么显示
//关于此类 配置的详细方法，看extjs的帮助文档
var cm_company = new Ext.grid.ColumnModel([new Ext.grid.RowNumberer()/*表格前的行号*/, {
	header : '公司名称',
	width : 90,
	sortable : true,//是否可排序
	dataIndex : 'company.companyName'//数据从哪个字段取来，（从Company里中的name字段）
	/*editor : new Ext.form.TextField({//表示此单元格可编辑
		allowBlank : false,
		maxLength : 50
	})*/
}, {
	header : '公司类型',
	width : 200,
	sortable : true,//是否可排序
	dataIndex : 'etypeName'//数据从哪个字段取来，（从Company里中的name字段）
}, {
	header : '公司地址',
	width : 200,
	sortable : true,//是否可排序
	dataIndex : 'company.address',
	menuDisabled : true
}, {
	header : '公司电话',
	width : 100,
	dataIndex : 'company.tellPhone',
	menuDisabled : true,//是否禁止下出菜单
	resizable : false//是否允许列宽可变，默认true
}, {
	header : '负责人',
	width : 60,
	dataIndex : 'company.leader',
	menuDisabled : true,
	resizable : false
}, {
	header : '联系电话',
	width : 100,
	dataIndex : 'company.mobilePhone',
	resizable : false,
	menuDisabled : true
}, {
	header : '备注',
	id : 'remark',
	dataIndex : 'company.remark'
	//menuDisabled : true
}]);

cm_company.defaultSortable = false;//全局设定cm_company列表为不可排序。


//添加分公司的表单
var addCompanyForm = new Ext.FormPanel({
		labelWidth : 70, 
		labelAlign : 'right',//对齐方式，有效值为"left," "top" 和 "right" (默认为"left")。该属性级联于没有设定此属性的子容器。
		
		url : 'saveCompany.action',//此处为 添加新数据的Struts的 Action ，类似于表单提交后 映射到哪个Action
		
		border : false,        //是否显示出面板body元素的 边框（缺省为true
		baseCls : 'x-plain',   //作用在面板元素上的CSS样式类 （默认为 'x-panel'）。
		bodyStyle : 'padding:5px 5px 0',//制定body元素的CSS样式。格式形如Ext.ElementapplyStyles（缺省为null）。
		anchor : '100%',         //this config is only used when this Component is rendered by a Container which has been configured to use an AnchorLayout based layout manager。 
		
		defaults : {            //应用在全体组件上的配置项
			width : 233,
			msgTarget : 'qtip'      // 验证信息（包括错误信息）在框附近显示，另外side 在右边显示，under在底部显示
		},
		defaultType : 'textfield', //设置 items里 容器的默认类型
		items : [{
			
			xtype : 'hidden',     //表示此属性为隐藏，一般每张表的id都是隐藏属性，用来操作表数据
			name : 'company.companyId',
			id : 'companyNameAdd'  //标志这个窗口，用于再现，监听用，和 hide属性配合使用。
		
		}, {
//			xtype : "textarea",     //写此字段，将覆盖默认的类型，详细请查看文档(日期控件为 datefield，多文本录入框为 textarea，隐藏此属性hidden)
		//  inputType : "password",  //输入类型，这样输入将显示 *
//			hidden : true           //隐藏此属性
			fieldLabel : '公司名称',
			name : 'company.companyName',//name字段为什么要这么写不用我多说了吧，（不懂去看看struts）
			allowBlank : false,  //是否允许为空
			
			maxLength : 50   //最大长度，即此字段允许输入的长度
		}, {
			fieldLabel : '公司类型',//此项为 下来列表的选择框 ，数据从数据库表获得，请仔细体会
//			name : 'etype.name',
			xtype : "combo", 
			allowBlank : false,
			maxLength : 40,
			//注意此id字段是窗体的唯一标识。不能有重复的，也就是说添加新公司里的id，与修改公司里 的id不能一样。
			id : 'enterpriseType',
			hiddenName : 'etypeId',//如果指定了, 则会动态生成一个以指定名称命名的隐藏域用来存放值数据(defaults to the underlying DOM element's name)。
			//即这个字段在提交时，送入后台的字段，为 企业类型 对应的id，后台根据这个字段修改COmpany的 外键
			
			valueField : 'etypeId',//组合框用以取值的数据的字段名（如果mode='remote'则默认为 undefined，如果mode = 'local' 则默认为 'value'）。
			//从企业类型表  取值的id字段
			
			displayField : 'etypeName',//组合框用以展示的数据的字段名，如果mode='remote'则默认为 undefined，如果mode = 'local' 则默认为 'text'）。
			//从企业类型表取值的 name字段
			
			mode : 'remote',//如果ComboBox读取本地数据则将值设为'local'（默认为 'remote' 表示从服务器读取数据）。
			store : ds_enterpriseType_select,//该组合框绑定的数据源（默认为 undefined）。
//			selectOnFocus : true,//值为 ture 时表示字段获取焦点时自动选择存在的文本(默认为 false)。
			editable : false,//值为false时防止用户直接在输入框内输入文本，就像传统的选择框一样（默认为 true）。
			triggerAction : 'all',//触发器被激活时执行的动作。使用'all'来运行由allQuery属性指定的查询（默认为'query'）。
			loadingText : '加载中...',
			emptyText : '公司类型名称'//默认提示文字
			/*listeners : {//监听 可以不使用
				'select' : function(combo, record, index) {
					this.ownerCt.findById('dept').reset(); // 可以通过findById来获得同一个表单中的ComboBox
					ds_dept_select.baseParams.companyId = this.ownerCt.form.findField('user.companyId').getValue();
					ds_dept_select.reload();
					this.ownerCt.form.findField('user.companyName').setValue(record.data.companyName);
				}
			}*/
		},{
			fieldLabel : '公司地址',
			name : 'company.address',
			allowBlank : false,
			maxLength : 70
		}, {
			fieldLabel : '公司电话',
			name : 'company.tellPhone',
			maxLength : 20
		}, {
			fieldLabel : '负责人',
			name : 'company.leader',
			allowBlank : false,
			maxLength : 20
		}, {
		//	xtype : "datefield",  //输入日期请使用此项自动加载日期控件
			fieldLabel : '联系电话',
			name : 'company.mobilePhone',
			maxLength : 20
		}, {
			fieldLabel : '备注',
			name : 'company.remark',
			xtype : 'textarea',
			maxLength : 200
		}],
		buttonAlign : 'right',//按钮对齐方式    ，center，left
		minButtonWidth : 60,//最小按钮宽度
		buttons : [{
			text : '添加',  // 添加 数据按钮
			handler : function(btn) {// handler 用于提交 表单
				//var frm = this.ownerCt.ownerCt.gerForm();//得到BasicForm的实例，可以调用BasicForm里的方法，用于操作表单
				//作用与下句相同，推荐使用下句
				var frm = addCompanyForm.getForm();
				
				if (frm.isValid()) {// 验证表单各字段是否 符合要求
					btn.disable();  //使 此 添加 按钮不可用，防止重复提交
					var cnfield = frm.findField('company.companyName'); // 获得公司名称 ,用于下面的错误提示
					
					frm.submit({   //提交表单
						waitTitle : '请稍候',
						waitMsg : '正在提交表单数据,请稍候...',
						
						success : function(form, action) { //如果 数据 添加 成功
							var store = grid_company.getStore(); //获得现在 grid_company的表格（），用于刷新表格
							if (store.data.length <= 20) { //这里把数据定为20不太好，如果分页查询，每页不是20个数据，程序中要改的地方就很多了
								var company = new Company({//获得刚提交的数据，用来刷新表格， 这样有点麻烦，还没有想到更好的实现方式。
									'company.companyId' : action.result.companyId,
									'company.companyName' : form.findField('company.companyName').getValue(),
									'etypeName' : Ext.get('enterpriseType').dom.value,//此属性用来获取 公司类型中 displayField 的值，即为id对应的中文字段（name）
									'company.address' : form.findField('company.address').getValue(),
									'company.tellPhone' : form.findField('company.tellPhone').getValue(),
									'company.leader' : form.findField('company.leader').getValue(),
									'company.mobilePhone' : form.findField('company.mobilePhone').getValue(),
									'company.remark' : form.findField('company.remark').getValue()
								});
								store.insert(0, [company]);//在客户端表格第一行插入新添加的数据
								if (store.data.length > 20) {//如果刚才表格数据是满页的（这里为20条），把store（表格）最后一条数据去掉
									store.remove(store.getAt(store.data.length - 1));
								}
							}

							Ext.Msg.alert('成功提示', '数据插入成功!!<br>'); //各种提示框 详见 文档MessageBox里
							btn.enable();//把按钮恢复可用。
						},
						failure : function() {
							Ext.Msg.show({//如果插入失败，弹出 错误提示框。
								title : '错误提示',
								msg : '"' + cnfield.getValue() + '" ' + '名称可能已经存在!',
								buttons : Ext.Msg.OK,
								fn : function() {
									cnfield.focus(true);
									btn.enable();//把按钮恢复可用。
								},
								icon : Ext.Msg.ERROR
							});
						}
					});
				}
			}
		}, {
			text : '重置',
			handler : function() {
				//注意 在extjs3.3中 ownerCt 属性 已不能完全支持(与以前的版本用法有区别)，所以最好不用此项
			//	this.ownerCt.ownerCt.getForm().reset();//ownerCt指获得上一级容器，此处意思是 获得 重置按钮 的上级容器（这里为buttons容器），然后调用FormPanel form的reset方法！
				addCompanyForm.getForm().reset();//与上代码作用相同
			}
		}, {
			text : '取消',
			handler : function() {
			//	this.ownerCt.ownerCt.hide();//两级ownerCt指的是上上级容器，在这里即为 window 容器的hide方法。最好不这样写
				window_add_company.hide();// window 容器的hide方法。
			}
		}]
	});


//添加分公司的弹出窗
var window_add_company = new Ext.Window({ 
	title : '添加分公司',
	width : 350,
	height : 440,
	resizable : false,//是否允许改变窗体大小
//	autoWidth : true,
	autoHeight : true,//自动调整高度，使用此项， heigth 配置项 无效
	modal : true,//True 表示当window显示时对其后面的一切内容进行遮罩，默认false
	closeAction : 'hide',//当关闭按钮被点击时执行的动作。“close”缺省的动作是从DOM树中移除window并彻底加以销毁。“hide” 只是在视觉上通过偏移到零下(negative)的区域的手法来隐藏，这样使得window可通过show 的方法再显示.
	listeners : {//此处用于 再显示上面隐藏的 窗体， 与  closeAction ： ‘hide’ 配合使用。
		'hide' : function() {
			this.setTitle('添加分公司');
			this.findById('companyNameAdd').ownerCt.getForm().reset();//监听窗口，用于再现窗口
		//	Ext.Msg.alert("tianjia","c测试用，表示进了listeners")
		}
	},
	
	//此处为添加新数据的form窗体 创建函数 (创建完放入 window里)
	items : [addCompanyForm]
});


//更新 公司 表单  ，从 window里分离出来的
var updateCompanyForm = new Ext.FormPanel({
		labelWidth : 70, 
		labelAlign : 'right',//对齐方式，有效值为"left," "top" 和 "right" (默认为"left")。该属性级联于没有设定此属性的子容器。
		
		url : 'updateCompany.action',//此处为 添加新数据的Struts的 Action ，类似于表单提交后 映射到哪个Action
		
		border : false,        //是否显示出面板body元素的 边框（缺省为true
		baseCls : 'x-plain',   //作用在面板元素上的CSS样式类 （默认为 'x-panel'）。
		bodyStyle : 'padding:5px 5px 0',//制定body元素的CSS样式。格式形如Ext.ElementapplyStyles（缺省为null）。
		anchor : '100%',         //this config is only used when this Component is rendered by a Container which has been configured to use an AnchorLayout based layout manager。 
		//此属性还没搞清楚
		
		defaults : {            //应用在全体组件上的配置项对象
			width : 233,
			msgTarget : 'side'      // 验证信息显示右边
		},
		defaultType : 'textfield', //设置 items里 容器的默认类型
		items : [{
			xtype : 'hidden',
			name : 'company.companyId'
		},{
		//	xtype : "textfield",    //写此字段，将覆盖默认的类型，详细请查看文档(日期控件为 datefield，多文本录入框为 textarea)
		//  inputType : "password",  //输入类型，这样输入将显示 *
			fieldLabel : '公司名称',
			id : 'companyNameUpdate',//***此id很重要，是窗体的唯一标识，不能重复
			name : 'company.companyName',
			allowBlank : false,    //是否允许为空
			regex :  /(^s*)|(s*$)/,//去除首尾空格及空白字符？
			maxLength : 50
		},{
			fieldLabel : '公司类型',//此项为 下来列表的选择框 ，数据从数据库表获得，请仔细体会
//			name : 'etypeName',
			xtype : "combo", 
			allowBlank : false,
			maxLength : 30,
			
			id : 'enterpriseType2',
			hiddenName : 'etypeId',//如果指定了, 则会动态生成一个以指定名称命名的隐藏域用来存放值数据(defaults to the underlying DOM element's name)。
			//即这个字段在提交时，送入后台的字段，为 企业类型 对应的id，后台根据这个字段修改Company的 外键
			
			valueField : 'etypeId',//组合框用以取值的数据的字段名（如果mode='remote'则默认为 undefined，如果mode = 'local' 则默认为 'value'）。
			//从企业类型表  取值的id字段
			
			displayField : 'etypeName',//组合框用以展示的数据的字段名，如果mode='remote'则默认为 undefined，如果mode = 'local' 则默认为 'text'）。
			//从企业类型表取值的 name字段
			
			mode : 'remote',//如果ComboBox读取本地数据则将值设为'local'（默认为 'remote' 表示从服务器读取数据）。
			store : ds_enterpriseType_select,//该组合框绑定的数据源（默认为 undefined）。
//			selectOnFocus : true,//值为 ture 时表示字段获取焦点时自动选择存在的文本(默认为 false)。
			editable : false,//值为false时防止用户直接在输入框内输入文本，就像传统的选择框一样（默认为 true）。
			triggerAction : 'all',//触发器被激活时执行的动作。使用'all'来运行由allQuery属性指定的查询（默认为'query'）。
			loadingText : '加载中...'
//			emptyText : '公司名称'//默认提示文字
			
		},{
			fieldLabel : '公司地址',
			name : 'company.address',
			allowBlank : false,
			maxLength : 70
		}, {
			fieldLabel : '公司电话',
			name : 'company.tellPhone',
			maxLength : 20
		}, {
			fieldLabel : '负责人',
			name : 'company.leader',
			allowBlank : false,
			maxLength : 20
		}, {
		//	xtype : "datefield",//输入日期，请使用此项
			fieldLabel : '联系电话',
			name : 'company.mobilePhone',
			maxLength : 20
		}, {
			fieldLabel : '备注',
			name : 'company.remark',
			xtype : 'textarea',
			maxLength : 250
		}],
		buttonAlign : 'right',//按钮对齐方式
		minButtonWidth : 60,//最小按钮宽度
		buttons : [{
			text : '修改',  // 添加 数据按钮
			handler : function(btn) {// handler 用于提交 表单
				var frm = updateCompanyForm.getForm();
				if (frm.isValid()) {// 验证表单各字段是否 符合要求
					btn.disable();  //使 此 添加 按钮不可用，防止重复提交
					var cnfield = frm.findField('company.companyName'); // 获得公司名称 ,用于下面的错误提示
					
					frm.submit({   //提交表单
						waitTitle : '请稍候',
						waitMsg : '正在提交表单数据,请稍候...',
						
						success : function(form, action) { //如果 数据 添加 成功	
							Ext.Msg.show({    //弹出成功提示框
							title : '成功提示',
							msg : '数据修改成功!',
							buttons : Ext.Msg.OK,
							fn : function(){btn.enable()},
							icon : Ext.Msg.INFO
						});
									
							var store = grid_company.getStore(); //获得现在 grid_company的表格，用于刷新表格
							var company = new Company({       //将修改过的数据放入这个实例里，刷新客户端表格
							'company.companyId' : form.findField('company.companyId').getValue(),
							'company.companyName' : form.findField('company.companyName').getValue(),
							'etypeName' : Ext.get('enterpriseType2').dom.value,//此属性用来获取 公司类型中 displayField 的值，即为id对应的中文字段（name）
							'company.address' : form.findField('company.address').getValue(),
						//	categoryName : Ext.get('category_edit').dom.value,
							'company.tellPhone' : form.findField('company.tellPhone').getValue(),
							'company.leader' : form.findField('company.leader').getValue(),
							'company.mobilePhone' : form.findField('company.mobilePhone').getValue(),
							'company.remark' : form.findField('company.remark').getValue()	
							
						//  imageUrl : action.result.imageUrl
						});
							var index = store.indexOf(grid_company.getSelectionModel().getSelected());  //的到选中数据的行号
							store.remove(grid_company.getSelectionModel().getSelected());//把选中数据从表中去除
							store.insert(index,company);					//插入修改后的新数据
							grid_company.getSelectionModel().selectRow(index);  //
							
							btn.enable();//把按钮恢复可用。
						},
						failure : function() {
							Ext.Msg.show({    //如果修改失败，弹出 错误提示框。
								title : '错误提示',
								msg : '"' + cnfield.getValue() + '" ' + '修改失败!',
								buttons : Ext.Msg.OK,
								fn : function() {
									cnfield.focus(true);
									btn.enable();
								},
								icon : Ext.Msg.ERROR
							});
						}
					});
				}
			}
		}, {
			text : '取消',
			handler : function() {
//				this.ownerCt.ownerCt.hide();//两级ownerCt指的是上上级容器，在这里即为 window 容器的hide方法。
				window_update_company.hide();//作用同上语句
			}
		} ]
});

//修改分公司      的弹出窗  （此表格和上边添加 表格是一样的，只有部分修改）
var window_update_company = new Ext.Window({ 
	title : '修改分公司',
	width : 350,
	height : 440,
	resizable : false,//是否允许改变窗体大小
	//autoWidth : true,
	autoHeight : true,//自动调整高度，使用此项， heigth 配置项 无效
	modal : true,//True 表示当window显示时对其后面的一切内容进行遮罩，默认false
	closeAction : 'hide',//当关闭按钮被点击时执行的动作。“close”缺省的动作是从DOM树中移除window并彻底加以销毁。“hide” 只是在视觉上通过偏移到零下(negative)的区域的手法来隐藏，这样使得window可通过show 的方法再显示.
		
	//此处为 修改数据的form窗体 创建函数 (创建完放入new出的window里)
	items : [updateCompanyForm]	
});


//添加分公司按钮 ， 点击 弹出添加 窗口
var btn_add_company = new Ext.Button({
	text : '添加分公司',
	iconCls : 'icon-add', //此处为按钮前的小图标， 定义在index.css文件中
//	disabled : true, //是否禁止按钮可用， 可以利用这一条进行权限检查，无权限的，把此按钮禁用
	handler : function() {
		window_add_company.show();   //show出 要弹出的 添加窗口window_add_company
		//var wine = new Ext.Window(window_add_company);
		//wine.show();
		
	}
});


//修改分公司按钮
var btn_update_company = new Ext.Button({
	text : '修改分公司',
	iconCls : 'icon-edit',
//	disabled : true, //是否禁止按钮可用， 可以利用这个属性进行权限检查，无权限的，把此按钮禁用
	handler : function(){
		var recordCompany = grid_company.getSelectionModel().getSelected();//获得选中行的数据，请仔细看看如何获得的
		if(recordCompany){  //如果有选中数据
			window_update_company.show();   //弹出  修改数据窗口
			updateCompanyForm.getForm().loadRecord(recordCompany);//将刚才选中的数据加到弹出窗口的表单里
		//	window_update_company.getComponet.getForm().loadRecord(recordCompany);
//			updateCompanyForm.getForm().findField('etypeName').
//			Ext.Msg.alert('msg',"公司类型="+recordCompany.get('etypeName')+" 公司id="+recordCompany.get('etypeId'));
		}
		else{
			Ext.Msg.alert('修改提示','请先选择要修改的数据!<br>')
		}
	}
});



//删除分公司 按钮 ，及实现
var btn_del_company = new Ext.Button({
	text : '删除分公司',
	iconCls : 'icon-del',
	handler : function() {
		var record = grid_company.getSelectionModel().getSelected();  //获得选中行数据
		
		if (record) {
			var companyId = grid_company.getSelectionModel().getSelected().get("company.companyId");// 获得选中行数据的id
			Ext.Msg.confirm('确认删除', '你确定删除该条记录?', function(btn) {//弹出确认删除按钮
				if (btn == 'yes') {
//					Ext.Msg.alert("msg11","companyId="+record.data.companyId);
					Ext.Ajax.request({
						url : 'deleteCompany.action',// Struts的Action ，通过它联系后台
						params : {
							companyId : companyId  //传过去的参数companyId
						},
						success : function() {    //如果成功  在当前的数据表单中把该行删去。
							grid_company.getStore().remove(record);//在页面中将 该行数据删除
						},
						failure : function() {
							Ext.Msg.show({
								title : '错误提示',
								msg : '删除时发生错误!',
								buttons : Ext.Msg.OK,
								icon : Ext.Msg.ERROR
							});
						}
					});//Ext.Ajax.request 结束
				}
			});//Ext.Msg 结束
		}//if (record)结束
		else{
			Ext.Msg.alert('提示信息','请先选中要删除的数据!<br>')
		}
	}//handler结束
});


//搜索 分公司 文本框 
var text_search_company = new Ext.form.TextField({
	name : 'textSearchCompany',
	width : 200,
	emptyText : '多个条件可用空格或逗号隔开!',//在文本框中的提示字符
	listeners : {
		'specialkey' : function(field, e) {
			if (e.getKey() == Ext.EventObject.ENTER) {// 判断搜索按钮是否被按下
				searchCompany();
			}
		}
	}
});


var searchCompany = function() {
	// 传参数一定要用这种方式,否则翻页的时候不会根据这些参数查询
	ds_company.baseParams.conditions = text_search_company.getValue();
	ds_company.load({
		params : {   //传的参数分页用
			start : 0,
			limit : 20
		}
	});
}

// 搜索 分公司 按钮
var btn_search_company = new Ext.Button({
	text : '查询',
	iconCls : 'icon-search',
	handler : searchCompany  //使此按钮 挂载到 searchCompany 上
});


//Store类封装了一个客户端的Record对象的缓存， 为诸如GridPanel、ComboBox和DataView等的小部件提供了数据的入口。
//要传输 和读取的数据格式，从后台传来的数据 保存的数据表单 ，通过这里进行缓存和转换 ，这是数据入口函数 ，  这里为json数据格式，我们项目中也用json数据。 详细见帮助文档 Ext.data.Store
var ds_company = new Ext.data.Store({
	//Proxy对象，用于访问数据对象
	proxy : new Ext.data.HttpProxy({   //一个Ext.data.DataProxy所实现的子类，能从Connection（针对某个URL地址）对象读取数据。
		url : 'findAllCompany.action'//Struts 的Action
	}),
	reader : new Ext.data.JsonReader({   //从传回来的json数据里按此格式读数据
		totalProperty : 'totalProperty',//   该属性是指定记录数的总数（可选的）（比如系统中此表一共有多少条数据符合要求）
		root : 'root'      //   该属性是指定包含所有行对象的数组，即后台传过来的数据串（在这里为分公司信息）
//		idProperty: "companyId" //   该属性是指定每一个行对象中究竟哪一个是记录的ID字段（可选的）
	},
	
/*	listeners : {//  还是有问题
		ds_company.load({
		params : {   //传的参数分页用
			start : 0,
			limit : 20
		}
		});
	},*/
	
	Company  //最上面的那个var Company = Ext.data.Record.create
	)
});



// 分公司管理 最外层的panel ，是个可编辑的面板（panel），但是我们一般不用可编辑模式
var grid_company = new Ext.grid.EditorGridPanel({ 
//	autoLoad : true,
	title : '分公司管理',
	iconCls : 'icon-grid',  //面板左上的那个小图标，在index.css文件中有定义
	loadMask : {msg : '数据加载中...'},
	region : 'center',
	cm : cm_company,   //cm：colModel的简写方式，渲染Grid所使用的Ext.grid.ColumnModel（必须的），就是配置列要怎么显示。
	ds : ds_company,  //ds是grid的数据源，DataStore的简称
	//sm ： selModel的简写方式，选择的模式。AbstractSelectionModel的子类，以为Grid提供选区模型（selection model）。（如不指定则默认为Ext.grid.RowSelectionModel）。
	sm : new Ext.grid.RowSelectionModel({singleSelect : true}), //选中 哪一行数据
	enableColumnMove : false, //True表示列可自由拖动（默认为true）。
	trackMouseOver : false,   //True表示为鼠标移动时高亮显示（默认为true）。
	frame : true,             //True表示为面板的边框外框可自定义的，false表示为边框为 1px的点线（默认为false）。
	
	//###*******此属性请特别小心使用，有可能导致列表无法显示的问题，可以不用这个属性*****************//
	autoExpandColumn : 'remark',  //指定某个列的 id ,  grid就会在这一列自动扩展宽度，以填满空白的位置，该id不能为0。
	//注意 这里 remark 为 列属性的 id 值，不是name值，不要弄错了。
	
	clicksToEdit : 2,         //要转换单元格为编辑状态所需的鼠标点击数（默认为两下，即双击）。把该项设置为“auto”表示鼠标移至选中单元格上面就开始编辑的状态。
	//我们修改一般不直接在行上修改，所以可以不要此项
	
	//面板顶部的工具条。 这里为面板上面的 按钮 ， 增删改 搜索等
	tbar : [btn_add_company, '-',btn_update_company, '-', btn_del_company, '-', text_search_company, btn_search_company],
	
	//bbar 面板底部的工具条。此项可以是Ext.Toolbar的实例、工具条的配置对象，或由按钮配置项对象构成的数组，以加入到工具条中。注意，此项属性渲染过后就不可用了，应使用getBottomToolbar的方法代替。
	bbar : new Ext.PagingToolbar({
		pageSize : 20,
		store : ds_company,
		displayInfo : true,
		displayMsg : '第 {0} - {1} 条  共 {2} 条',
		emptyMsg : "没有记录"
	})/*,
	listeners : {   //这部分为 面板的可编辑模式监听修改数据，由于我们一般不这样修改数据，所以此部分不用。
		'afteredit' : function(e) {
			Ext.Ajax.request({
				url : 'updateCompany.action',
				params : {
					fieldName : e.field,
					fieldValue : e.value,
					companyId : e.record.data.companyId
				},
				success : function() {
					// alert("数据修改成功！");
				},
				failure : function() {
					Ext.Msg.show({
						title : '错误提示',
						msg : '修改数据发生错误,操作将被回滚!',
						fn : function() {
							e.record.set(e.field, e.originalValue);
						},
						buttons : Ext.Msg.OK,
						icon : Ext.Msg.ERROR
					});
				}
			});
		}
	}*/
});


var p_company = {    // ViewPort调用的话，这里边的属性就是viewport的属性设置
	id : 'company-panel',
	border : true,
	layout : 'fit',  //可以设定为 fit 自适应
	items : [grid_company]
};

/*
var win = new Ext.Window(p_company);
			win.render("p");
			win.show();
	  var pen = new Ext.Panel(p_company);
	  pen.render(document.body);*/

//记住了Ext.onReady为ext的入口函数，含有此入口的js 在jsp或者html页面中要最后加载进来（要放在最后）！！
Ext.onReady(function(){
    Ext.QuickTips.init();//出错提示信息初始化
    Ext.form.Field.prototype.msgTarget = 'side';//提示信息默认显示位置
    
	var vp = new Ext.Viewport(p_company);//新建个viewport，让其填充整个可用区域。	
	
	/*new Ext.Viewport({
		layout:"fit",
		items:[grid_company]	
	});	*/
    Ext.get('loading').remove();//去除 加载动画图标及文字	
   //Ext.BLANK_IMAGE_URL = 'risk/resources/images/default/s.gif';
	//Ext.getDom('header').style.visibility = 'visible';
});
